﻿using System;
using System.ComponentModel;
using System.IO;
using System.Reflection;
using System.Xml;

namespace MassIntellect.WorkIt
{
	public class BasicLog
	{
		public const string DEFAULT_FORMAT_DATETIME_FILENAME = "yyyy-MM";
		public const string DEFAULT_FORMAT_DATETIME_LOG = "yyyy-MM-dd HH:mm:ss";

		[Serialize(SerializeAs.Attribute, IgnoreDefault = true)]
		[Browsable(true)]
		[Description("Имя")]
		public string Name { get; set; }

		/// <summary>
		/// Каталог, в котором будет сохранятся лог
		/// </summary>
		[Serialize(SerializeAs.Attribute, IgnoreDefault = true)]
		[Browsable(true)]
		[Description("Каталог сохранения лога.")]
		public string Directory { get; set; }

		/// <summary>
		/// Префикс в имени лог-файла
		/// </summary>
		[Serialize(SerializeAs.Attribute, IgnoreDefault = true)]
		[Description("Префикс в имени лог-файла.")]
		public string Prefix { get; set; }

		/// <summary>
		/// Строка форматирования даты-времени в имени файла лога.
		/// </summary>
		[Serialize(SerializeAs.Attribute, IgnoreDefault = true)]
		[Browsable(true)]
		[Description("Строка форматирования даты-времени в имени файла лога. По-умолчанию (если строка пустая), формат " + DEFAULT_FORMAT_DATETIME_FILENAME + ".")]
		public string FormatDateTimeFileName { get; set; }

		/// <summary>
		/// Строка форматирования даты-времени строки лога.
		/// </summary>
		[Serialize(SerializeAs.Attribute, IgnoreDefault = true)]
		[Browsable(true)]
		[Description("Строка форматирования даты-времени строки лога. По-умолчанию (если строка пустая), формат " + DEFAULT_FORMAT_DATETIME_LOG + ".")]
		public string FormatDateTimeLog { get; set; }

		#region ILogHandler Members

		[Browsable(true)]
		public string FullPath
		{
			get
			{
				return Path.Combine(PathExtension.CorrectPath(Directory ?? ""), PathExtension.CorrectPath("{0}-{1}.log".goFormat(
					!Prefix.IsEmpty()
						? Prefix
						: Path.GetFileName(Assembly.GetEntryAssembly().Location),					
					DateTime.Now.ToString(
						!FormatDateTimeFileName.IsEmpty()
							? FormatDateTimeFileName
							: DEFAULT_FORMAT_DATETIME_FILENAME))));
			}
		}

		public void LogThis(string sender, string desc, params object[] args)
		{
			LogThis(sender, (desc ?? "").goFormat(args));
		}

		protected string GetDateTimePrefix()
		{
			return DateTime.Now.ToString(
				!FormatDateTimeLog.IsEmpty()
					? FormatDateTimeLog
					: DEFAULT_FORMAT_DATETIME_LOG);
		}

		public void LogString(string desc)
		{
			LogNative("{{{0} [LOG] {1}}}", GetDateTimePrefix(), desc);
		}

		public void LogNative(string nativeString, params object[] args)
		{
			string fn = FullPath;
#if !DEBUG
			try
#endif
			{

				string dir = Path.GetDirectoryName(fn);
				if (!dir.IsEmpty() && !System.IO.Directory.Exists(dir))
					System.IO.Directory.CreateDirectory(dir);
				using (var sw = new StreamWriter(new FileStream(fn, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
					sw.WriteLine(nativeString.goFormat(args));
			}
#if !DEBUG
			catch (Exception ex)
			{
				Console.WriteLine("Не удалось записать лог. Ошибка: {0}", ex.Message);
			}
#endif
		}

		public void LogThis(string sender, string desc)
		{
			LogString("{0}: {1}".goFormat(sender, desc));
		}

        

		#endregion

		public override string ToString()
		{
			return "{0} '{1}'".goFormat((Name.IsEmpty() ? "Лог" : Name), FullPath);
		}
	}
}